from conf.conf_opertion import ConfOpertion
from Common.log_opertion import logs
import pymysql
import pymysql.cursors



conf=ConfOpertion()

class ConnectMysql:
    def __init__(self):
        self.logs=logs
        self.mysql_data={
            'host':conf.get_mysql_value('host'),
            'port':int(conf.get_mysql_value('port')),
            'user':conf.get_mysql_value('user'),
            'password':conf.get_mysql_value('password'),
            'database':conf.get_mysql_value('database'),
        }
        try:
            self.conn=pymysql.connect(**self.mysql_data,charset='utf8')
            """
            使用 DictCursor游标时，查询结果会以字典形式返回，其中列名作为键，对应值作为值。
            这使得数据访问更直观，因为你可以通过列名（row['column_name']）而非索引位置（row[0]）来访问字段，提高了代码的可读性和可维护性
            """
            self.cursor=self.conn.cursor(cursor=pymysql.cursors.DictCursor)
            self.logs.info("""数据库连接成功!
            host:{host},
            port:{port},
            user:{user},
            password:{password},
            database:{database}
            """.format(**self.mysql_data))
        except Exception as e:
            self.logs.error(f'数据库连接异常!异常信息:{e}')

    def ass_serch(self,sql):
        try:
            self.cursor.execute(sql)
            self.conn.commit()
            data=self.cursor.fetchall()

            return data
        except Exception as e:
            self.logs.error(f'数据库查询操作异常!异常信息:【{e}】')
        finally:
            self.close()

    def query(self,sql,select_type='all'):
        try:
            self.cursor.execute(sql)
            self.conn.commit()
            if select_type=='all':
                data=self.cursor.fetchall()
            else:
                data = self.cursor.fetchone()
            return data
        except Exception as e:
            self.logs.error(f'数据库查询操作异常!异常信息:【{e}】')
        finally:
            self.close()
    def execute(self,sql):
        """
        用于执行数据库语句,如增删改查
        """
        try:
            # row_result结果根据增删改查,返回对应操作 所插入/被修改/被删除/所查询 的行数
            row_result=self.cursor.execute(sql)
            self.conn.commit()
            return row_result
        except Exception as e:
            self.logs.error(f'数据库语句【{sql}】操作异常!异常信息:【{e}】')
            # 如果数据库操作异常,就回滚数据防止遭到破坏
            self.conn.rollback()
            raise

    def close(self):
        try:
            if self.cursor and self.conn:
                self.cursor.close()
                self.conn.close()
        except Exception as e:
            self.logs.error(f'数据库关闭异常:{e}')


if __name__ == '__main__':
    con=ConnectMysql()
    sql='show databases'